خرید بک لینک

مفاهیم اولیه زبان C

در این فصل به مقدمات اولیه برنامه نویسی به زبان C می پردازیم و اصول اولیه آن را بررسی می نماییم

آنچه در ادامه مطلب می خوانید

شناسه ها در C

انواع داده


مفاهیم اولیه زبان C

در این فصل به مقدمات اولیه برنامه نویسی به زبان C می پردازیم و اصول اولیه آن را بررسی می نماییم

شناسه ها در C

شناسه (identifier) نامی است که به یک قسمت از برنامه مانند متغیر، تابع، ثابت و یا ... داده می شود. در زبان C برای انتخاب شناسه ها فقط می توان از علائم زیر استفاده کرد: - حروف انگلیسی کوچک و بزرگ (A…Z a…z)
- ارقام (0…9)
- علامت خط پایین یا _


البته یک شناسه تمی تواند با یک رقم شروع شود. مثلا شناسه های sum ، average ، name2 و یا student_average مجاز هستند، اما شناسه های 2name و یا student average مجاز نیستند. البته در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند student_average از studentAverage استفاده گردد. یعنی بجای اینکه در شناسه ها از _ برای جداکننده استفاده کنیم، اولین حرف هر قسمت را بصورت بزرگ بنویسیم.

نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان C برخلاف بسیاری از زبانهای دیگر به کوچک و بزرگی حروف حساس است (case sensitive). در نتیجه شناسه های زیر با یکدیگر متفاوتند :

Sum ≠ sum ≠ SUM

این مسئله معمولا درهنگام برنامه نویسی باعث ایجاد بعضی خطاها می شود.
آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای منظورهای خاص در زبان C رزرو شده اند استفاده کنید. زبان C دارای 32 کلمه کلیدی است که عبارتند از :

auto,break,case,char,const,cntinue,default,do,double,else,enum,exte,float, for,goto,if,int,long,register,retu,short,signed, sizedof,static,struct,switch,

typedof,union,unsigned,void,volatile,while

.توجه داشته باشید که بعضی از کامپایلر هایC،علاوه بر این 32 کلمه ی کلیدی ، کلمات دیگری را به زبان اضافه کرده اند به طور مثال در codevision کلمات کلیدی به قرار زیر است.

,Break,bit ,case ,char,const ,continue ,default, do ,double, eeprom ,else, enum, exte, flash,float,for,funcused,goto,if,inline,int,interrupt,long ,register ,retu ,short ,signed ,sizeof ,sfrb

,sfrw ,static, struct, switch, typedef union ,unsigned void, volatile ,while,

انواع داده

هدف از برنامه نویسی، ورود داده ها به کامپیوتر(میکروکنترلر نیز نوعی کامپیوتر می باشد)، پردازش داده ها و استخراج نتایج است . پس داده ها نقش مهمی را در برنامه نویسی ایفا می کنند.

انواع داده ها و مقادیر قابل قبول آنها

هشت بیت :

char, -127 to 127

unsignec char, 0 to 255

signed char, -127 to 127

شانزده بیت :

short int, -32767 to 32767

unsigned short int, 0 to 65535

signed short int , -32767 to 32767

بین شانزده تا سی و دو بیت :

int , -32767 to 32767

unsigned int, 0 to 65535

singned int , -32767 to 32767

سی و دو بیت :

long int, -2147483647 to 2147483647

signed long int , -2147483647 to 2147483647

unsigned int, 0 to 4294967295

float, 7raghame deghat

شصت و چهار بیت :

double , 15raghame deghat

هشتاد بیت :

longf double , 19 raghame deghat

متغیر ها

متغیر نامی برای کلمات حافظه است که داده ها در آنها قرار می گیرند و ممکن است در طول اجرای برنامه تغییر کنند. برای مراجعه به متغبر از نامشان استفاده می کنیم. بنابرابن متغیرها امکان نامگذاری برای کلمات حافظه را فراهم می کنند. متغیر ها باید دارای نوع باشند، یعنی متغیر های بدون نوع در C شناخته نمی شوند.

تعیین نوع متغیر را تعریف متغیر گویند.

برای تعیین نوع متغیر اینگونه عمل می کنیم :

; نام متغیر نوع داده

تعریف متغیر ها :

int x.y ;

float m.n;

char ch1.ch2;

double d1;

long int p1;

اسامی مجاز برای متغیر ها :

count

test23

sum

S_1

اسامی غیر مجاز برای متغیر ها :

1test

high!there

grade.1

.pcx

برای مقدار دادن به متغیر ها :

۱.هنگام تعریف نوع متغیر

int x,y =5 ;

۲. پس از تعریف نوع متغیر و با دستور انتساب(=)

int x,y,z ;

float f1,f2 ;

x=12 ;

y=z=2 ;

f1=f2=12.34 ;

۳.با دستورات ورودی

int x,z ;

scanf ("%d%d,&x,&z) ;

عملگرها

نمادهایی هستند که اعمال خاصی را انجام میدهند.

عملگرهای محاسباتی

این نوع عملگر ها، محاسباتی را روی عملوندها انجام می دهند.

- تفریق و منهای یکانی

+ جمع

* ضرب

/ تقسیم

% باقیمانده ی تقسیم

-- کاهش

++ افزایش

تقدم عملگرهای محاسباتی

(از بالاترین تقدم به پایین ترین تقدم)

-- ++

- (منهای یکانی)

% / *

- +

عملگرهای رابطه ای

این نوع عملگرها ، ارتباط بین عملوندها را مشخص می کنند.

< بزرگتر

> کوچکتر

=< بزرگتر یا مساوی

=> کوچکتر یا مساوی

= = متساوی

=! نا مساوی

عملگرهای منطقی

این نوع عملگرها بر روی عبارات منطقی عمل می کنند. عبارات منطقی دارای دو ارزش درستی و نادرستی اند.(ارزش نادرستی با مقدار صفر و ارزش درستی با مقادیر غیر صفر مشخص می شوند.)

! نقیض(not)

&& و((and

|| یا(or)

تقدم عملگرهای منطقی و رابطه ای

!

= > > = < <

=! = =

&&

||

(تقدم این عملگرها پایین تر از سایر عملگرها ست)

عملگرهای ترکیبی

از ترکیب عملگرهای محاسباتی و علامت = مجموعه دیگری از عملگر ها ایجاد می شود که عمل محاسباتی و انتساب را انجام دهند.

= + انتساب جمع

= - انتساب تفریق

= * انتساب ضرب

= / انتساب تقسیم

= % انتساب باقیمانده ی تقسیم

همانطور که گفته شد این زبان ، یک زبان ساخت یافته است و هر برنامه در این زبان ، شامل یک یا چند تابع است.یکی از این توابع main() است. این تابع به عنوان تابع اصلی بوده و بقیه ی تئوابع جزء توابع فرعی هستند.

اجرای یک برنامه باید با تابع اصلی شروع شود یعنی همان main() . ابتدا باید تابع اصلی و سپس تابع فرعی را بنویسیم. بعد از main() متغیر های مورد استفاده ی این تابع تعریف می شود.

سپس تابع اصلی با یک } شروع و به { ختم می شود. تعریف توابع فرعی پس از توابع اصلی صورت می گیرد.

نباید فراموش کرد که توابع مورد استفاده ی برنامه نویس در کجا قرار دارند و برنامه چگونه به آنها دسترسی پیدا می کند.این توابع و سایر اطلاعاتی که کامپایلر برای ترجمه ی برنامه به آنها وجود دارد، در تعدادی از فایل ها به نام فایل های سرآیند (header)قرار دارند.

پسوند فایل های سرآیند .h است.و معمولا بر روی فهرستی از دیسک به نام INCLUDE قرار دارند. برنامه نویس باید بداند که هر تابع مورد استفاده در برنامه در کدام فایل سرآیند قرار دارد و همان فایل را به برنامه اضافه کند.

برای اتصال فیل های سرآیند از دستوری به نام #include استفاده می شود. این دستور قبل از main() قرار می گیرد.

<فایل سرآیند>#include

int main()

{

اعلان متغیرها

دستورات اجرایی

}

Printf()

این تابع در فایل stdio.h قرار دارد و برای چاپ اطلاعات در صفحه ی نمایش به کار می رود.

نحوه کاربرد تابع printf :

به دوصورت به کار می رود :

(" <عبارت 1> ")printf

(<عبارت 2>،"<عبارت1>")printf

<عبارت2> اطلاعاتی است که باید به خروجی منتقل شود و <عبارت1> می تواند شامل موارد ذیل باشد:

1.اطلاعاتی که باید عینا در خروجی چاپ شود.

2.کاراکترهای تعیین کننده ی فرمت خروجی.(این نوع کاراکترها نوع اطلاعاتی را که در <عبارت2>ذکر شده اند و باید به خروجی بروند مشخص می کنند. این کاراکتر ها با % شروع می شوند.)

3.کاراکترهای کنترلی.(این نوع کاراکتر ها شکل خروجی اطلاعات را مشخص میکنند و با \ شروع می شوند)

کاراکترهای فرمت (عمومی ترین آنها)

%c یک کاراکتر یه خروجی می رود.

d% اعداد صحیح دهدهی مثبت و منفی به خروجی می رود.

%f اعداد صحیح دهدهی مثبت و منفی به خروجی می رود.

%% علامت%

البته ناگفته نماند که حدود17 کاراکتر فرمت را زبان c می شناسد که در اینجا به همین چهار کاراکتر اکتفا می کنیم.

کاراکترهای کنترلی

\f موجب انتقال کنترل به صفحه ی جدید می شود.

\n موجب انتقال کنترل به خط جدید می شود.

\" چاپ کوتیشن( " )

back slash \\

و چند نوع دیگر که در صورت لزوم به توضیح آنها نیز می پردازیم.

مثال:

برنامه ای که دو رشته را به خروجی می برد:

#include

int main()

{

printf("our blog is:\n ");

printf("www.iseee.ir");

}

و جمله ای که در خروجی چاپ می گردد:

Our blog is:

www.iseee.ir

scanf()

برای ورود اطلاعات از کی بورد از تابع scanf() استفاده می کنیم. که این تابع یک تابع همه منظوره در ورود دادها است. الگوی این تابع در فایلstdio.h می باشد که با یک جستجوی ساده در محیط برنامه می توانیم به این موضوع پی ببریم. این تابع همه ی داده ها را از ورودی خوانده و به راحتی در حافظه ذخیره می نماید.

scanf() الگوی استفاده از

(<عبارت دوم> , "<عبارت اول>")scanf()

<عبارت دوم>شامل آدرس متغیرهایی است که باید از ورودی خوانده شوند و <عبارت اول> نحوه ی خوانده شدن ورودی را مشخص می کند.

<عبارت اول>شامل سه نوع کاراکتر است:

1.کاراکترهای فرمت. این کاراکترها تعیین می کنند که چه نوع اطلاعاتی باید از ورودی خوانده شود.(این کاراکتر ها نیز با % شروع می شوند.)

2.کاراکترهای فضای خالی(space) فضای خالی باعث می شود تا این تابع از این فضای خالی در ابتدای اطلاعات ورودی صرف نظر کند.tab,new line,form feed نیز به عنوان فضای خالی محسوب می شوند.

3.کاراکترهایی قبل از فضای خالی و فرمت. وجود چنین کاراکتری موجود می شود تا چنانچه همان کاراکتر در رشته ی ورودی وجود داشته باشد,آن را خوانده از آن صرف نظر کند.

(وقتی دستورscanf() اجرا می شود, منتظر می ماند تا داده ها را از صفحه کلید دریافت نمیاد. هنگام وارد کردن داده, هر یک از اقلام داده را با یک فاصله یا کاما(,)از هم جدا می کنیم و پس از ورود داده ها, کلیدEnter را فشار می دهیم.)

getch() و getche() خواندن کاراکتر باتوابع

این توابع کاراکتری را از ورودی خوانده و در متغیر مورد نظر قرار می دهد. این توابع در فایلconio.h قرار دارند.

الگوی استفاده از این توابع به صورت ذیل است:

;()getch/getche = متغیر

وقتی برنامه به این دستورات می رسد, منتظر می ماند تا کلیدی فشار داده شود. در آن صورت کاراکتر معادل این کلید, در متغیر قرار می گیرد.

و یا به صورتی دیگر:

getch();

getche();

در اینصورت برنامه منتظر می ماند تا کلیدی از صفحه کلید فشار داده شود. پس از فشردن کلید, اجرای بقیه دستورات برنامه ادامه می یابد.

تفاوتهای این دو تابع:

تابعgetch() عکس العملی در صفحه ی نمایش ندارد. یعنی وقتی کلیدی فشار داده می شود, کاراکتر معادل آن در صفحه ی نمایش ظاهر نمی شود. در حالی که تابع getche() پس از خواندن کاراکتر آن را در صفخه ی نمایش نشان می دهد. در ضمن در این توابع برعکس تابع scanf() هیچ نیازی به فشردن کلید Enter نیست.

برچسب: نویسنده: rfmw تاريخ: دوشنبه 30 شهريور 1388 ساعت: 18:0

ساختارهای کنترلی (قسمت اول)

در برنامه نویسی ساخت یافته، هر برنامه از 3 ساختار کنترلی بنام: ساختار ترتیب، ساختار انتخاب و ساختار تکرار تشکیل می گردد. از آنجا كه اين 3 ساختار، نحوه و ترتيب اجراي برنامه را كنترل مي كنند، به آنها ساختارهاي كنترلي گفته مي شود. تا کنون فقط با برنامه هایی سروکار داشته ایم که از ساختار ترتیب استفاده می کرده اند، چرا که دستورهای زبان C در حالت عادی به همان ترتیبی که نوشته شده اند، یکی پس از دیگری اجرا می شوند.

اما زبان C دارای 3 نوع ساختار انتخاب می باشد که عبا رتند از : ساختار if یا ساختار تک انتخابی، ساختار if / else یا ساختار دو انتخابی و ساختار switch یا ساختار چند انتخابی. علاوه براین، این زبان دارای 3 نوع ساختار تکرار بنامهای while، for و do / while نیز می باشد که هریک را بطور کامل شرح خواهیم داد.

آنچه در ادامه مطالب خواهید خواند

1- ساختار انتخاب if

2- ساختار انتخاب else if

3- ساختار تكرار while

و کاربرد هر یک از آنها همراه با مثال



اگر بخواهیم تحت شرایطی، تعدادی از دستورات اجرا شود و یا تعدادی دیگر از دستورات اجرا نشود؛ باید از ساختارهای تصمیم استفاده کنیم. این ساختارها شرطی را تست کرده در صورت صحیح بودن شرط ، مجموعه ای از دستورات را انجام می دهد

ساختار انتخاب if

همان دستور انتقال کنترل شرطی است،شرطی را تست می کند و در صورتی که آن شرط دارای ارزش درستی باشد،مجموعه ای از دستورات را اجرا می کند.

این دستور به شکل زیر استفاده می شود:

if () ;

نحوه کار بدینصورت است که ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا خواهد شد و در صورتیکه نادرست باشد، بدون اینکه دستور قسمت را اجرا کند به دستور بعدی خواهد رفت.

الگوی اول:

(شرط) if

; دستور

else

; دستور

الگوی دوم:

(شرط) if

}

; دستور اول

; دستور دوم

.

.

.

; دستورn ام

{

else

{

; دستور n1

; دستور n2

.

.

.

; دستور n

{

این دستور می تواند بصورت زیر نیز استفاده گردد:

if () ;
else ;

در اینصورت ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا خواهد شد، و در صورتیکه نادرست باشد، دستور قسمت اجرا خواهد شد. در هر حال فقط یکی از این دو قسمت اجرا خواهد گردید.

دقت کنید که پرانتز استفاده شده پس از دستور if برخلاف برخی زبانهای دیگر، اجباری است. علاوه براین، در این دستور نیازی به استفاده از then نمی باشد.

بعنوان مثال چنانچه متغیر grade حاوی نمره دانشجو باشد و بخواهیم بر مبنای نمره وی، پیغام مناسبی چاپ کنیم، می توانیم از دستور زیر استفاده کنیم:

if (grade> = 10) printf(“Passed !”);
else printf(“Failed!”);

در حالت عادی دستور if منتظر یک دستور در بدنه خود می باشد، اما چنانچه می خواهید چندین دستور را در بدنه یک دستور if دهید، باید آنها را در داخل آکولاد باز وبسته { } قرار دهید. این مجموع دستورات را یک دستور مرکب می گویند. بطور کلی در زبان C هرجا که می توان یک دستور قرار داد، می توان از یک دستور مرکب نیز استفاده کرد. به یک دستور مرکب، بلوک نیز گفته می شود. بنابراین صورت کلی دستور if به شکل زیر است:

if () {
;
;
….
;
}
else {
;
;
…….
;
}

توجه کنید که وجود قسمت else اختیاری است و در ضمن ممکن است یکی از دو قسمت دارای دستور ساده و دیگری دارای دستور مرکب باشد. بعنوان یک مثال کاملتر به برنامه زیر توجه کنید:

برنامه 1) برنامه ای بنویسید که ضرایب یک معادله درجه 2 را دریافت و ریشه های آن را محاسبه و چاپ نماید.

#include
#include
#include
#include
void main() {
int a, b, c;
float x1, x2, delta;
clrscr();
printf(“Please enter a, b and c : “);
scanf(“%d %d %d”, &a, &b, &c);
if (a==0) {
printf(“wrong equation!”);
exit(1) ;
}
delta = b*b – 4*a*c;
if (delta <0)
printf(“No answer !”);
else if (delta == 0) {
x1 = -b / (2*a);
printf(“There is one answer, x = %f”,x1);
}
else {
delta = sqrt(delta);
x1 = (-b+delta) / (2*a);
x2 = (-b-delta) / (2*a);
printf(“There are two answers, x1= %4.2f and x2= %4.2f”, x1, x2);
}
}
Please enter a, b and c : 3 -7 2
There is two answers, x1 = 2.00 and x2 = 0.33

چندين نكته درمورد برنامه بالا قابل ذكر است.

1- در اين برنامه از 2 تابع جديد استفاده شده است. اولي تابع sqrt كه يك عدد را به عنوان ورودي دريافت و جذر آن را باز مي گرداند. اين تابع در فايل math.h تعريف شده است. و ديگري تابع exit كه باعث مي شود اجراي برنامه خاتمه يابد. اين تابع نيز در فايل stdlib.h تعريف شده است.

2- به نحوه دندانه گذاري در برنامه دقت كنيد، هرجا كه بلوك جديدي ايجاد شده است، دستورات آن حدود 3 كاراكتر جلوتر نوشته شده اند. اينكار باعث مي شود كه خوانايي برنامه افزايش يابد.

3- توجه كنيد كه همانطور كه قبلا نيز گفته شد، خروجي يك عبارت مقايسه اي، يك عدد است كه 0 نشانه نادرست و هر عدد ديگر نشانه درست است. بنابراين در قسمت شرط يك دستور if مي توان بجاي يك عبارت مقايسه اي، هر عبارت ديگري كه يك مقدار عددي بازگرداند نيز قرار داد! بعنوان مثال مي توان بجاي دستور

if (a==0) …

از دستور زير استفاده كرد:

if (!a) …

دراينصورت چنانچه a برابر صفر باشد، نادرست تلقي خواهد شد و در نتيجه نقيض آن يعني ! ، درست محسوب مي گردد.
يك روش متداول استفاده از دستور if، استفاده از if هاي تودرتو مي باشد كه در مثال بالا نيز ديده مي شود. دراينحالت مجموعه اي از عبارات if-else-if بصورت متداخل قرار داده مي شوند. بعنوان نمونه به مثال زير توجه كنيد:

if (grade> = 18) printf("good!");
else if (grade> = 15) printf("medium!");
else if (grade> = 12) printf("rather weak!");
else if (grade> = 10) printf("weak");
else printf("failed!");

در چنين دستوري، كليه شرطها بترتيب از بالا به پايين بررسي شده و به محض اينكه يكي از آنها درست باشد، دستور مربوط به آن اجرا شده و از بقيه دستورات صرفنظر مي گردد. درصورتيكه هيچ يك از شرطها درست نباشد، دستور مربوط به آخرين else اجرا مي گردد. درچنين حالتي توصيه مي گردد كه شرطهاي نادر را كه امكان وقوع آنها كم است، در انتهاي كار بررسي نماييد، تا تعداد مقايسه كمتري صورت پذيرد.

مشكلي كه در مورد if هاي تودرتو پيش مي آيد، مسئله تعيين if مربوط به هر else است. بعنوان مثال در مورد دستور زير، else به كدام if تعلق دارد؟

if (a if (c ;
else ;

همانطور كه از دندانه گذاري نيز مشخص است، else مربوط به دومين if مي باشد. يعني درصورتي اجرا خواهد شد كه a

iif (a < b) if (a if (c ; if (c ;
else ; }
else ; else ;

بعنوان يك مثال ديگر، به نمونه زير دقت كنيد:

if () {
if ()
if () ;
else ; // this refer to if ()
}
else ;//this refer to if

برنامه 2) برنامه اي بنويسيد كه 3 عدد را دريافت و حداكثر آنها را چاپ كند.

#include
void main() {
int a, b, c, max;
printf("Please enter 3 numbers :");
scanf("%d %d %d",&a, &b, &c);
if (a> b)
if (a> c) max = a;
else max= c;
else if (b> c) max = b;
else max = c;
printf("Maximum is %d",max);
}

ساختار تكرار while

همانطور كه در بخش الگوريتمها نيز گفته شد، يك ساختار تكرار باعث مي شود تا زمانيكه شرط خاصي برقرار است، عمليات مشخصي تكرار گردد. دستور while نيز باعث ايجاد يك حلقه تكرار به شكل زير مي گردد:

while () ;

اين دستور باعث مي شود تا زمانيكه شرط موجود در قسمت درست است، دستور قسمت تكرار شود، و به محض اينكه شرط نادرست گردد، كنترل اجرا به دستور بعد از حلقه مي رود.

بازهم دستور موجود در قسمت مي تواند يك دستور مركب باشد، دراينصورت دستور بصورت زير درخواهد آمد:

while () {
;
;
…….
;
}

برنامه 3) برنامه اي بنويسيد كه يك عدد را دريافت و فاكتوريال آن را محاسبه و چاپ نمايد.

#include
void main() {
int i,number;
long int factorial;
printf("Please enter number :");
scanf("%d",&number);
factorial = 1;
i = 1;
while (i <= number) {
factorial *= i;
i ++;
}
printf("Factorial of %d is %ld"number,factorial);
}

برنامه 4) برنامه اي بنويسيد كه يك متن را از كاربر دريافت و آن را با حروف بزرگ چاپ كند.

#include
void main() {
char ch;
ch = getch() ;
while (ch != 13) {
if (ch>= 'a' && ch <= 'z')
ch -= 32;
putch(ch);
ch = getch();
}
}


برچسب: نویسنده: rfmw تاريخ: دوشنبه 30 شهريور 1388 ساعت: 17:0

ساختارهای کنترلی (قسمت دوم)

در برنامه نویسی ساخت یافته، هر برنامه از 3 ساختار کنترلی بنام: ساختار ترتیب، ساختار انتخاب و ساختار تکرار تشکیل می گردد. از آنجا كه اين 3 ساختار، نحوه و ترتيب اجراي برنامه را كنترل مي كنند، به آنها ساختارهاي كنترلي گفته مي شود. تا کنون فقط با برنامه هایی سروکار داشته ایم که از ساختار ترتیب استفاده می کرده اند، چرا که دستورهای زبان C در حالت عادی به همان ترتیبی که نوشته شده اند، یکی پس از دیگری اجرا می شوند.

اما زبان C دارای 3 نوع ساختار انتخاب می باشد که عبا رتند از : ساختار if یا ساختار تک انتخابی، ساختار if / else یا ساختار دو انتخابی و ساختار switch یا ساختار چند انتخابی. علاوه براین، این زبان دارای 3 نوع ساختار تکرار بنامهای while، for و do / while نیز می باشد که هریک را بطور کامل شرح خواهیم داد.

آنچه در ادامه مطالب خواهید خواند

1 -ساختار تكرار for

2- حلقه do / while

3- Switch/ case

4- دستورات break و continue

و کاربرد هر یک از آنها همراه با مثال


ساختار تكرار for

همانگونه كه در مثال مربوط به حل مسئله فاكتوريال ديده مي شود، گاهي نياز به حلقه تكراري داريم كه به تعداد دفعات مشخصي تكرار گردد. در چنين مواقعي با استفاده از يك متغير شمارنده، تعداد تكرارها را تا رسيدن به مقدار مورد نظر می شماریم و سپس به حلقه پایان می دهیم. به چنین حلقه هایی، تکرار تحت کنترل شمارنده یا تکرار معین می گوییم، چرا که تعداد تکرار ها از قبل مشخص است. چنین حلقه ای دارای 3 جزء اصلی می باشد:

1- مقداردهی اولیه به متغیر شمارنده حلقه
2- شرط پایان حلقه (پایان شمارش)
3- نحوه افزایش متغیر شمارنده

از آنجا که در تمام حلقه هایی که تکرار معین دارند، همین ساختار استفاده می شود؛ در اکثر زبانهای برنامه سازی یک ساختار تکرار ویژه، بنام حلقه for، برای اینکار در نظر گرفته شده است. اما در این بین، حلقه تکرار for در زبان C دارای ویژگیهای خاصی است که آنرا از سایر زبانها متمایز کرده و به آن قدرت بسیار بالایی داده است. شکل کلی این دستور بصورت زیر است:

for ( ; ; ) ;

وظایف عبارات فوق بشرح زیر است :

1- ، مقداردهی اولیه به متغیر حلقه

2- ، شرط اجرای حلقه

3- ،نحوه افزایش متغیر حلقه

البته همانندموارد قبل بازهم قسمت می تواند یک دستور مرکب باشد. نحوه کار حلقه بدینصورت است که در ابتدای شروع حلقه فقط برای یکبار اجرا می شود. سپس عبارت بررسی می گردد و در صورتیکه درست ارزیابی شود (≠ 0)، آنگاه دستور اجرا شده و سپس به ابتدای حلقه باز می گردد. از اجرای دوم به بعد، ابتدا عبارت اجرا می گردد (یعنی متغیر حلقه افزایش می یابد) و سپس عبارت بررسی می گردد و مجددا درصورت درست بودن، حلقه تکرار می شود. اینکار تا زمانیکه مقدار عبارت نادرست ( = 0) ارزیابی شود، تکرار می گردد. به محض اینکه این اتفاق بیفتد، کنترل اجرا به دستور پس از حلقه انتقال می یابد.
درحقیقت هر حلقه for معادل با حلقه while زیر است:

;
while () {
;
;
}

بعنوان یک مثال ساده، تکه برنامه زیر اعداد بین 0 تا 100 را چاپ می نماید:

int count;
for (count = 0; count <= 100; count ++)
printf(“%d “,count);

اگر بخواهيم تنها مضارب 5 چاپ شوند، حلقه را به شكل زير تغيير مي دهيم:

for (count = 0; count <= 100; count += 5)

حتي مي توان مضارب 5 را از آخر به اول چاپ كرد:

for (count = 100; count> = 0; count -= 5)

قسمت شرط مي تواند يك شرط مركب نيز باشد، بعنوان مثال:

for (count = 0; count <100 && sw==1; count ++)

كه در اينصورت در هربار اجراي حلقه، علاوه بر مقدار شمارنده، مقدار متغير sw نيز بررسي مي گردد.

نكته آخر اينكه قسمت مقدار دهي اوليه و افزايش متغير نيز مي توانند شامل چند عبارت باشند كه در اينصورت با كاما از يكديگر جدا مي شوند. بعنوان مثال:

for (a = 0, b = 100; b – a> 50; a++, b--)

در ادامه یک مثال کاملتر برای تشریح این حلقه آمده است:

برنامه 5) برنامه ای بنویسید که تعدادی عدد را از کاربر دریافت و 2 عدد بزرگتر و مجموع آنها را محاسبه و چاپ نماید.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; i
printf(“enter number : “);
scanf(“%d”,&number);
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

نكته جالب در مورد حلقه for آنستكه مي توان هريك از 3 عبارت فوق را حذف كرد. به مثالهاي زير توجه كنيد:

for (;i<100; i++)

مقداردهي اوليه حذف شده است. اين در صورتي است كه بنحوي قبل از شروع حلقه، مقدار متغير i تعيين شده باشد.

for (i= 0;i<100;)

نحوه افزايش متغير حلقه حذف شده است. اين مورد زماني بكار مي رود كه نحوه افزايش متغير حلقه پيچيده بوده و توسط برنامه نويس در داخل حلقه انجام شود.

for (;i<100;)

هر دو مورد فوق حذف شده است.

for (i=0; ;i++)

شرط ادامه حلقه حذف شده است. اين مورد زياد متداول نيست و ممكن است باعث شود حلقه براي هميشه اجرا شود. در چنين مواردي حتما بايد در داخل حلقه با استفاده از دستور break (كه در قسمتهاي بعدي توضيح داده خواهد شد)، راهي براي خروج از حلقه قرار داده شود.

(;;)for

}

; دستوراول

; دستور دوم

.

.

.

; دستور n ام

}

می بینیم که ، for فاقد مقدار اولیه ، شرط حلقه ، و گام حرکت است. این دستور برای اجرای حلقه ی تکرار بی نهایت(حلقهی تکراری می باشد که شرط پایان ندارد) مورد استفاده قرار می گیرد. برای اتمام این حلقه باید کلیدCTRL+BREAK را فشرد.

حال اگر بخواهیم یک حلقه ی تکرار را در حلقه ای دیگر قرار دهیم،از اصطلاحی به عنوان حلقه های تکرار تو در تو استفاده می کنیم .

یک اصل مهم در رابطه با حلقه های تکرار تو در تو:

این است که ؛ به ازای هر بار اجرای حلقه تکرار خارجی ، حلقه تکرار داخلی به طور کامل اجرا می شود. انتهای حلقه تکرار داخلی ، زودتر از حلقه ی تکرار خارجی مشخص می شود.

مثلا:

for (i=0;i<5;i++

}

.....

for(j=0;j<7;j++)

{

…..

{

.....

{

(حلقه ی تکرار با اندیس i ، حلقه ی خارجی و حلقه با اندیس j ، حلقه ی داخلی می باشد)

ناگفته نماند که اگر حلقه های تکرار تو در تو ، از یکجا شروع و به یکجا ختم شوند، حلقه ی خارجی نیاز به { } ندارد.

مثلا:

for(i=0;i<5;i++)

(++ for(j=0;j<=8;j

}

.....

{

حلقه do / while

همانگونه كه در قسمت الگوريتمها توضيح داده شد، در بعضي مواقع لازم است كه شرط ، در انتهاي حلقه بررسي گردد. دستور do / while از نوع حلقه هايي است كه ابتدا دستورات را اجرا كرده و سپس شرط ادامه حلقه را بررسي مي نمايد. شكل كلي اين دستور بصورت زير است:

do
;
while () ;

نحوه كار اين حلقه به اين صورت است كه ابتدا دستور اجرا مي گردد، سپس شرط حلقه بررسي شده و درصورتيكه درست بود، به ابتداي حلقه باز گشته و آن را مجددا اجرا مي كند. البته دستور مي تواند يك دستور مركب باشد.

بعنوان يك مثال كوچك، ممكن است شما از كاربر خواسته ايد كه اعلام كند آيا مايل به ادامه هست يا خير؟ وي بايد پاسخ y يا n بدهد، اما ممكن است يك حرف اشتباه (مانند m) وارد كند. قصد داريم تكه برنامه اي بنويسيم كه عمل دريافت پاسخ را تا زمانيكه يك حرف درست وارد شود، تكرار كند. مسلم است كه بايد ابتدا يك پاسخ وارد شود و سپس درستي آن بررسي گردد.

char answer;
do {
printf("Do you want to continue (y/n) ?");
answer = getch();
} while (answer != 'y' && answer != 'n') ;

بعنوان يك نمونه كاملتر به مثال زير توجه كنيد.

برنامه 6) فرض كنيد نمرات يك گروه از دانشجويان بصورت درجه بندي (A, B, C and D) آماده شده است. برنامه اي بنويسيد كه نمرات دانشجويان را دريافت و در پايان درصد هريك از نمرات را محاسبه و چاپ نمايد. در ضمن از آنجا كه تعداد دانشجويان از قبل مشخص نيست، كاربر در انتهاي نمرات، حرف Q (مخفف Quit) را وارد مي نمايد.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
if (grade == 'A') aCount ++;
else if (grade == 'B') bCount ++;
else if (grade == 'C') cCount ++;
else if (grade == 'D') dCount ++;
else if (grade == 'Q') n --;
else {
printf("Wrong grade, try again.\n");
n --;
}
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main

Switch/ case

اگر مجددا به برنامه 6 دقت كنيد، خواهيد ديد كه در بعضي موارد قصد داريم برحسب مقادير مختلف يك عبارت (در اينجا مقدار متغير grade)، عمليات متفاوتي را انجام دهيم. گرچه اينكار با استفاده از دستورات if / else متداخل قابل انجام است، اما ساختار مناسبتري نيز براي اينكار وجود دارد، كه به آن ساختار چندانتخابي مي گوييم. شكل كلي ان ساختار بصورت زير است:

switch () {
case : ;
;
…
;
case : ;
;
…
;
…
default : ;
;
…
;
}

برنامه 7) برنامه 6 را با استفاده از دستور switch / case بازنويسي نماييد. برنامه را بگونه اي بنويسيد كه حروف بزرگ و كوچك هردو مورد قبول واقع شود.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
switch (grade) {
case 'A' :
case 'a' : aCount ++; break ;
case 'B' :
case 'b' : bCount ++; break ;
case 'C' :
case 'c' : cCount ++; break ;
case 'D' :
case 'd' : dCount ++; break ;
case 'Q' :
case 'q' : n--; break ;
default : printf("Wrong grade, try again.\n");
n --;
} //end switch
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main

برنامه 8) برنامه اي بنويسيد كه يك عدد، يك عملگر و يك عدد ديگر را از كاربر دريافت و پس از اعمال عملگر برروي دو عدد، حاصل را چاپ نمايد.

#include
void main() {
int number2, number2, result;
char op ;
printf("Please enter number1 operator number2 : ");
scanf("%d %c %d",&number1, &number2, &op, &number3);
result = 0;
switch (op) {
case '+' : result = number1 + number2 ; break;
case '-' : result = number1 - number2 ; break;
case '*' : result = number1 * number2 ; break;
case '/' : if (number2 != 0) result = number1 / number2 ;
else printf("There is no answer!\n");
break;
case '%' : if (number2 != 0) result = number1 % number2 ;
else printf("There is no answer!\n");
break;
default : printf("invalid operator!\n");
}
printf("Result = %d",&result);
}

انتقال کنترل غیر شرطی

دستور if شرطی را بررسی کرده و بر اساس نتیجه ی شرط دستوراتی را نیز انجام می دهد. در زبان برنامه نویسی C دستورالعملهایی وجود دارند که بدون تست شرطی می توانند کنترل اجرای برنامه را از نقطهای به نقطه ی دیگر منتقل کنند . این دستورات را انتقال کنترل غیر شرطی می گویند.

دستورات کنترل غیر شرطی شامل دستور break،continue و goto می باشد

دستورات break و continue

اين دستورات قادرند مسير اجراي برنامه را در يك حلقه تكرار تغيير دهند. البته اين تغيير مسير بصورت كنترل شده بوده و همانند دستور goto نمي توان به هرجاي دلخواه پرش كرد.

چنانچه دستور break در يك ساختار while، for، do/while ويا switch بكار رود، باعث مي شود كه بلافاصله كنترل اجراي برنامه از ساختار خارج شده و به اولين دستور پس از ساختار برود. قبلا كاربرد اين دستور را در switch ديده ايد. در اينجا به مثال زير دقت كنيد:

برنامه 9) برنامه 5 را بگونه اي تغيير دهيد كه فقط اعداد مثبت را بپذيرد، و درصورتيكه عدد منفي وارد شد، بلافاصله به عمليات خاتمه داده و نتايج تا همين نقطه را چاپ نمايد.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; i
printf(“enter number : “);
scanf(“%d”,&number);
if (number <0) break; // this is the difference
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

اما دستور continue فقط در حلقه هاي while، for و do/while بكار مي رود. نحوه عمل آن بدين صورت است كه به محض آنكه كنترل اجرا به اين دستور برسد، بلافاصله از باقيمانده حلقه صرفنظر كرده و مجددا به ابتداي حلقه باز مي گردد و اجراي آن را از سر مي گيرد. در مورد حلقه for، پس از بازگشت به ابتداي حلقه، عمل افزايش مقدار متغير حلقه نيز صورت مي پذيرد.

بعنوان مثال، چنانچه بخواهيم برنامه 9 را بگونه اي تغيير دهيم كه از اعداد منفي صرفنظر كند و آنها را در محاسبات لحاظ نكند، كافيست دستور

if (number <0) break;

را به دستور زير تبديل كنيم:

if (number <0) continue;

دراينصورت، چنانچه عدد منفي باشد، بدون اينكه محاسبات بعدي انجام شوند، كنترل به ابتداي حلقه بازگشته و عدد بعدي را دريافت مي كند.

از مقالات مسعود اشرفی

برچسب: نویسنده: rfmw تاريخ: دوشنبه 30 شهريور 1388 ساعت: 16:7


توابع

در اکثر زبانهای برنامه نوسی برنامه ها به بخشهایمختلفی تقسیم می شوند که به این بخشها زیر برنامه گفته می شود.

زیر برنامه ها به 2 دسته کلی تقسیم می شوند

1- زیر برنامه زیر روال procedure :که دارای چندین خروجی هستند

2- زیر برنامه تابع function :که حداکثر یک خروجی بر می گردانند

تذکر: در زبان C ما فقط زیر برنامه تابع داریم (توابعفقط دارای یک خروجی می باشند)

تابع: قسمتی از برنامه که اجرای بخشی از برنامهرا به عهده می گیرد. توابع معمولا در برنامه های طولانی برای خوانایی بهتر برنامهمورد استفاده قرار می گیرد به این صورت که ابتدا برنامه نویس وظیفه ای که ازبرنامه می خواهد را به وظایف کوچکتر تقسیم بندی کرده و هر وظیفه را با تعریف تابعبه آن تابع محول می کند یا به عبارتی دیگر توابع قطعه برنامه هایی هستند که بااتصال به یک دیگر برنامه اصلی را به وجود می آورند.

در توابع باید وظیفه ی تابع مشخص باشد، همچنینورودیها و خروجیهای تابع نیز باید مشخص و تعریف شوند.

دوستان می تونن فایل کامل این مقاله رو از لینک زیر دانلود کنن!!!!!



برچسب: نویسنده: rfmw تاريخ: شنبه 28 شهريور 1388 ساعت: 20:29

موضوع آموزش: اسکن صفحه کلید

نوع فایل:pdf

زبان برنامه نویسی: C

کامپایلر: codevision

فایل الحاقی: شبیه سازی با proteus

حجم فایل: 595k

محتوی فایل آموزشی:

اسکن صفحه کلید در مرحله اول به روش کاملا ساده با توضیحات کامل،

اسکن صفحه کلید با استفاده از وقفه صفر میکرو(حساس به لبه پایین رونده)

نحوه دریافت ورودی از صفحه کلید ونمایش آن بر روی lcd

قرار دادن ارقام ورودی پشت سر هم سپس نمایش آن به صورت رشته بر روی lcd

دوستان میتونن آموزش اسکن صفحه کلید رو به زبان C از لینک زیر دانلود کنند

دانلود

برچسب: نویسنده: rfmw تاريخ: چهارشنبه 18 شهريور 1388 ساعت: 0:39

صفحه بندی